//package com.tgpms.intreceptor;
//
//
//import com.alibaba.fastjson.JSON;
//import com.tgpms.auth.security.JavaWebToken;
//import com.tgpms.common.Result;
//import com.tgpms.util.Common;
//import com.tgpms.util.GetIp;
//import com.tgpms.web.earlierStage.controller.DocUploadEntityHistoryController;
//import com.tgpms.web.logs.entity.SystemLogs;
//import com.tgpms.web.logs.service.SystemLogsService;
//
//import io.netty.util.internal.StringUtil;
//import org.aspectj.lang.JoinPoint;
//import org.aspectj.lang.ProceedingJoinPoint;
//import org.aspectj.lang.annotation.*;
//import org.aspectj.lang.reflect.MethodSignature;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.context.annotation.Configuration;
//import org.springframework.web.context.request.RequestAttributes;
//import org.springframework.web.context.request.RequestContextHolder;
//import org.springframework.web.context.request.ServletRequestAttributes;
//
//import javax.servlet.http.HttpServletRequest;
//import javax.servlet.http.HttpServletResponse;
//import java.lang.reflect.Method;
//import java.math.BigDecimal;
//import java.util.*;
//
///**
// * @author newway
// * <p>
// * AOP 拦截记录日志
// */
//@Configuration
//@Aspect
//public class ControllerInterceptor {
//
//	private final Logger log = LoggerFactory.getLogger(DocUploadEntityHistoryController.class);
//
//    @Autowired
//    private SystemLogsService systemLogsService;
//
//    /**
//     * 获取用户
//     */
//    protected static String getUserName = null;
//
//    /**
//     * 获取用户对应的真实IP
//     */
//    protected static String getUserIp = null;
//
//    /**
//     * 获取请求的接口
//     */
//    protected static String getInterface = null;
//
//    /**
//     * 获取请求接口参数
//     */
//    protected static String getParams = null;
//
//    /**
//     * 获取接口执行时间
//     */
//    protected static BigDecimal getExecutionTime = null;
//
//    /**
//     * 获取方法名
//     */
//    protected static String getMethodName = null;
//
//    /**
//     * 获取返回值
//     */
//    protected static String getReturnName = null;
//
//    /**
//     * 获取异常
//     */
//    protected static String getError = null;
//
//    /**
//     * 接口调用时间
//     */
//    protected static Date getInterfaceExecutionTime = null;
//
//    /**
//     * 定义拦截规则：拦截quailty.web.controller包下面的所有类中，有@RequestMapping注解的方法。
//     *
//     *     Pointcut("execution(* com.tgpms.quailty.web..*.*(..)) ||" +
//     *             " execution(* quailty.web.bpm.controller..*.*(..)) ||" +
//     *             " execution(* quailty.web.qualitymanager.controller..*.*(..))")
//     */
//    @Pointcut("execution(* com.tgpms.web.*.controller..*.*(..)) ||" +
//            " execution(* com.tgpms.interfaces.dto..*.*(..))")
//    public void controllerMethodPointcut() {
//    	log.info("拦截开始。。。。。。");
//    }
//
//    @Before("controllerMethodPointcut()")
//    public void before(JoinPoint joinPoint) {
//        String name = joinPoint.getSignature().getName();
//    }
//
//    @After("controllerMethodPointcut()")
//    public void after(JoinPoint joinPoint) {
//        String name = joinPoint.getSignature().getName();
//    }
//
//    @AfterReturning(pointcut = "controllerMethodPointcut()", returning = "result")
//    public void afterReturning(JoinPoint joinPoint, Object result) {
//        String name = joinPoint.getSignature().getDeclaringTypeName() + '.' + joinPoint.getSignature().getName();
//    }
//
//    @AfterThrowing(pointcut = "controllerMethodPointcut()", throwing = "throwable")
//    public void afterThrowing(JoinPoint joinPoint, Throwable throwable) {
//        String name = joinPoint.getSignature().getName();
//        getError = throwable.toString();
//    }
//
//    /**
//     * 拦截器具体实现
//     * implement of Interceptor
//     *
//     * @param pjp
//     * @return null BaseResponse
//     */
//    @Around("controllerMethodPointcut()")
//    public Object interceptor(ProceedingJoinPoint pjp) throws Exception {
//    	log.info("拦截开始。。。。。。环绕拦截开始");
//        getInterfaceExecutionTime = Calendar.getInstance().getTime();
//        long beginTime = System.currentTimeMillis();
//
//        RequestAttributes ra = RequestContextHolder.getRequestAttributes();
//        ServletRequestAttributes sra = (ServletRequestAttributes) ra;
//        HttpServletRequest requests = sra != null ? sra.getRequest() : null;
//        Object result = null;
//        //只保存修改和删除操作
//        if(requests!=null && requests.getMethod()!=null) {
//        	String rmethod = requests.getMethod();
//            if(rmethod.equals("PUT") || rmethod.equals("DELETE")  || rmethod.equals("POST") ) {
//    	        // 请求地址
//    	        getInterface = requests != null ? requests.getRequestURI() : null;
//    	        String token = requests != null ? requests.getHeader("Authorization") : null;
//    	        Map<String, Object> stringObjectMap = JavaWebToken.parserJavaWebToken(token);
//    	        getUserName = String.valueOf(stringObjectMap != null ? stringObjectMap.get("username") : null);
//    	        assert requests != null;
//
//            	String ipAddr = new GetIp().getIpAddr(requests);
//
//                MethodSignature signature = (MethodSignature) pjp.getSignature();
//                // 获取被拦截的方法
//                Method method = signature.getMethod();
//                // 获取被拦截的方法名
//                String methodName = method.getName();
//
//                //保存所有请求参数
//                Set<Object> allParams = new LinkedHashSet<>();
//
//                Object[] args = pjp.getArgs();
//                boolean hasRequest = false;
//                for (Object arg : args) {
//                    if (arg instanceof Map<?, ?>) {
//                        Map<String, Object> map = (Map<String, Object>) arg;
//                        allParams.add(map);
//                    } else if (arg instanceof HttpServletRequest) {
//                        HttpServletRequest request = (HttpServletRequest) arg;
//                        Map<String, String[]> paramMap = request.getParameterMap();
//                        if (paramMap != null && paramMap.size() > 0) {
//                            //remove password,token
//                            if (paramMap.containsKey("username") && paramMap.containsKey("password")) {
//                                allParams.add(paramMap.get("username"));
//                            } else if (paramMap.containsKey("token")) {
//                                allParams.add("token:***********");
//                            } else {
//                                allParams.add(paramMap);
//                            }
//                            hasRequest = true;
//                        }
//                    } else if (arg instanceof HttpServletResponse || arg instanceof Exception) {
//                        hasRequest = true;
//                    } else {
//                        if (!hasRequest) {
//                            allParams.add(arg);
//                        }
//                    }
//                }
//
//                if (!"putAll".equals(methodName)) {
//                    getMethodName = methodName;
//                    if (! "uploadFile".equals(methodName)) {
//                        getParams = JSON.toJSONString(allParams);
//                    }
//                } else {
//                    log.info("\n 方法: {}", methodName);
//                }
//
//                try {
//                    if (result == null) {
//                        result = pjp.proceed();
//                        if (rmethod.equals("PUT") || rmethod.equals("DELETE")) {
//                            getReturnName = JSON.toJSONString(result);
//                        } else {
//                            getReturnName = JSON.toJSONString("查询");
//                        }
//                    }
//                } catch (Throwable e) {
//                    log.error("exception: {}", e);
//                    throw new Exception(e);
//                }
//
//                long costMs = System.currentTimeMillis() - beginTime;
//                getExecutionTime = new BigDecimal(costMs);
//                if ("0:0:0:0:0:0:0:1".equals(ipAddr) || StringUtil.isNullOrEmpty(ipAddr)) {
//                    ipAddr = "127.0.0.1";
//                    getUserIp = ipAddr;
//                } else {
//                    getUserIp = ipAddr;
//                }
//                //增加日志
//                systemLogsService.addlogs(addData());
//            }else {
//            	try {
//                    if (result == null) {
//                        result = pjp.proceed();
//                    }
//                } catch (Throwable e) {
//                    log.error("exception: {}", e);
//                    throw new Exception(e);
//                }
//            }
//        }else {
//        	try {
//                if (result == null) {
//                    result = pjp.proceed();
//                }
//            } catch (Throwable e) {
//                log.error("exception: {}", e);
//                throw new Exception(e);
//            }
//        }
//        return result;
//    }
//
//    /**
//     * 添加数据
//     *
//     * @return
//     */
//    public SystemLogs addData() {
//    	SystemLogs qualityLogs = new SystemLogs();
//    	qualityLogs.setLogsId(Common.fromDateFormats()+UUID.randomUUID().toString().replaceAll("-", ""));
//        qualityLogs.setLogsUsers(getUserName);
//        qualityLogs.setLogsIp(getUserIp);
//        qualityLogs.setLogsInterface(getInterface);
//        qualityLogs.setLogsParams(getParams);
//        qualityLogs.setLogsExecutionTime(getExecutionTime);
//        qualityLogs.setLogsMethodName(getMethodName);
//        qualityLogs.setLogsReturnValues(getReturnName);
//        qualityLogs.setLogsError(getError);
//        qualityLogs.setLogsNowTime(getInterfaceExecutionTime);
//        return qualityLogs;
//    }
//}